home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / UTILREEN / PRNTUTIL.LZH / SPS.8 < prev    next >
Text File  |  1987-05-02  |  16KB  |  439 lines

  1. ;SPS.COM is a TSR program to do a selective print screen. It prints
  2. ;the characters within a box defined by the cursor position. When
  3. ;started, if P is pressed, the whole screen is printed, and if Esc
  4. ;is pressed, the print screen is aborted.
  5.  
  6. Colormem  equ  0B800h    ;Color video mem for page 1
  7. Monomem   equ  0B000h    ;Mon video mem for page 1
  8. Timer     equ  8         ;Timer int #
  9. Enterkey  equ  28        ;Define scan codes
  10. Home      equ  71
  11. Endkey    equ  79
  12. Esc       equ  1
  13. Lfarrow   equ  75
  14. Rtarrow   equ  77
  15. Uparrow   equ  72
  16. Dnarrow   equ  80
  17. Pgup      equ  73
  18. Pgdn      equ  81
  19. Cntrl     equ  29        ;Scan code for control key
  20. Cntnot    equ  Cntrl+128 ;Scan code fpr control key release
  21. Lshrel    equ  42+128    ;Scan code for left shift release
  22. Rshrel    equ  54+128    ;  "   "    " right  "      "
  23. Video     equ  10h       ;Bios video interrupt
  24. DOS       equ  21h       ;DOS interrupt
  25. Getvec    equ  35h       ;Get int vector DOS service
  26. Setvec    equ  25h       ;Set int vector DOS service
  27. Setcur    equ  2         ;Set cursor pos video service
  28. Getcur    equ  3         ;Get cursor pos video service
  29. Promptpos equ  25*160-36 ;5th char from end of screen
  30.  
  31.           jmp  Initialize     ;Install the program as int 5 (PrtScn)
  32.  
  33. Oldint5:  
  34. Oldoff5   dw   ?         ;Save old int 5 offset and segment here
  35. Oldseg5   dw   ?
  36. Oldint8:
  37. Oldoff8   dw   ?
  38. Oldseg8   dw   ?
  39. Oldint9:
  40. Oldoff9   dw   ?         ;Save old keyboard int here
  41. Oldseg9   dw   ?
  42. Vidmem    dw   ?         ;Current video mem segment
  43. Curpos    dw   ?         ;Cursor position at start
  44. Curtyp    dw   ?         ;Cursor type
  45. Stloc     dw   0         ;Start row:col of print box
  46. Endloc    dw   184fh     ;End row:col of print box
  47. Timeval   db   ?
  48. Vpage     db   ?         ;Current video page
  49. Endflg    db   0         ;1=> start row:col set
  50. Prtflg    db   0         ;1=> screen has been printed
  51. Cntflg    db   0         ;1=> Cntrl being pressed
  52. Row       db   ?         ;Rows to print
  53. Col       db   ?         ;Columns to print
  54. Buffer:   dw   18 dup(?) ;Put original prompt data here
  55. Msg1:     db   'Speptp psptpaprptp pppopspiptpipopnp'
  56. Msg2:     db   'Speptp pepnpdp pppopspiptpipopnp p p'
  57. Msg3:     db   'Pprpipnptpeprp pnpoptp prpepapdpyp p'
  58. Rowbuf:   db   83 dup(?) ;Buffer for a screen row of chars
  59.  
  60. Newint5:  push bp,ax,bx,cx,dx,si,di,ds,es ;Save all for calling pgm
  61.           mov  bp,sp
  62.           mov  ds,cs          ;Set both for this code
  63.           mov  es,cs
  64.           mov  cx,Colormem    ;Assume color display
  65.           mov  ah,15          ;Get current video mode
  66.           int  Video
  67.           mov  Vpage,bh       ;Save video page
  68.           cmp  al,2           ;Color?
  69.           je   A1             ;Yes
  70.           cmp  al,3           ;Color?
  71.           je   A1             ;Yes
  72.           cmp  al,7           ;Mono?
  73.           je   A0             ;Yes
  74.           mov  sp,bp
  75.           pop  es,ds,di,si,dx,cx,bx,ax,bp ;Restore all for calling pgm
  76.       cs  jmp  far d[Oldint5] ;and do a graphics print screen
  77.  
  78. ;Come here if 80 col text mode.
  79. A0:       mov  cx,Monomem     ;Yes, set for Mono
  80. A1:       mov  bl,0           ;bx=page offset
  81.           add  cx,bx          ;Video segment
  82.           mov  Vidmem,cx      ;Save it
  83.  
  84. ;Save old and install new Keyboard int 9 and Timer int 8 to this code.
  85.           push ds
  86.           mov  ax,0           ;Set ds=0 (int area)
  87.           mov  ds,ax
  88.           cli                 ;Disable interrupts
  89.           mov  ax,[32]
  90.           mov  bx,[34]
  91.           mov  cx,[36]
  92.           mov  dx,[38]
  93.           mov  cs:Oldoff8,ax
  94.           mov  cs:Oldseg8,bx
  95.           mov  cs:Oldoff9,cx  ;to storage
  96.           mov  cs:Oldseg9,dx
  97.           mov  w[32],Newint8
  98.           mov  w[34],cs
  99.           mov  w[36],Newint9
  100.           mov  w[38],cs
  101.           sti                 ;Enable ints
  102.           pop  ds
  103.  
  104. ;Initialize variables.
  105.           mov  Stloc,0        ;Start of screen
  106.           mov  Endloc,184Fh   ;End of screen
  107.           mov  Endflg,0       ;Clear flags
  108.           mov  Prtflg,0
  109.           mov  Cntflg,0
  110.  
  111. ;Get current Cursor position and type.
  112.           mov  ah,Getcur      ;Get cursor row:col
  113.           mov  bh,Vpage
  114.           int  Video
  115.           mov  Curpos,dx      ;Save it
  116.           mov  Curtyp,cx      ;Save cursor type
  117.  
  118. ;Move cursor to top of screen.
  119.           xor  dx,dx          ;Top of screen
  120.           call Poscur
  121.           mov  cx,0607h       ;Set new cursor
  122.           mov  ah,1
  123.           int  Video
  124.  
  125. ;Get last 18 bytes from screen.
  126.           push ds
  127.           mov  ax,Vidmem      ;Set ds=Vidmem
  128.           mov  ds,ax
  129.           mov  si,Promptpos   ;ds:si=prompt pos
  130.           mov  di,Buffer      ;es:di=buffer
  131.           mov  cx,18          ;Get 18 words
  132.           rep  movsw          ;to buffer
  133.           pop  ds
  134.  
  135. ;Display prompt.
  136.           mov  si,Msg1        ;Print 'start' prompt
  137.           call Prompt
  138.  
  139. ;Hang up computer and wait for keyboard input.
  140. Waithere: jmp  Waithere       ;Wait for keyboard int
  141.  
  142. Newint8:
  143.       cs  cmp  Timeval,0
  144.           je   X1
  145.       cs  dec  Timeval
  146. X1:   cs  jmp far d[Oldint8]
  147.  
  148. ;This is the new Keyboard int 9 routine. Does not pass keys on to
  149. ;other programs, so they never know keys were pressed.
  150. Newint9:  sti
  151.           push ax             ;Save reg
  152.           in   al,60h         ;Get scan code
  153.           cmp  Prtflg,0       ;Is screen being printed?
  154.           jne  B0             ;Yes, clear keyboard and return from int
  155.           cmp  al,Lshrel      ;Left shift release?
  156.           je   A2             ;Yes
  157.           cmp  al,Rshrel      ;Right shift release?
  158.           jne  A3             ;No
  159. A2:       pop  ax
  160.       cs  jmp far d[Oldint9]  ;Yes, send to BIOS
  161. ;No, process the key command.
  162. A3:       cmp  al,Home        ;Home?
  163.           jne  C1             ;No
  164.           xor  dx,dx          ;Set for start of screen
  165. B1:       call Poscur         ;Set cursor there
  166. ;Reset keyboard and sen End Of Interrupt
  167. B0:       call Resetkbd       ;Reset keyboard
  168.           pop  ax
  169.           iret                ;Send back to Wait line
  170.  
  171. C1:       cmp  al,Endkey      ;End key?
  172.           jne  C2             ;No
  173.           mov  dx,184Fh       ;Set for end of screen
  174.           jmp  B1
  175.  
  176. C2:       cmp  al,Uparrow     ;Up arrow?
  177.           jne  C3             ;No
  178.           cmp  dh,0           ;On top line?
  179.           je   B0             ;Yes
  180.           dec  dh             ;Dec row
  181.           jmp  B1
  182.  
  183. C3:       cmp  al,Dnarrow     ;Down arrow?
  184.           jne  C4             ;No
  185.           cmp  dh,24          ;On bottom row?
  186.           je   B0             ;Yes
  187.           inc  dh             ;Inc row
  188.           jmp  B1
  189.  
  190. C4:       cmp  al,Lfarrow     ;Left arrow?
  191.           jne  C5             ;No
  192.           cmp  cs:Cntflg,0       ;Cntrl left arrow?
  193.           je   C4A            ;No
  194.           mov  dl,0           ;Set for 1st col
  195.           jmp  B1
  196. C4A:      cmp  dl,0           ;At 1st col?
  197.           je   B0             ;Yes
  198.           dec  dl             ;Dec col
  199.           jmp  B1
  200.  
  201. C5:       cmp  al,Rtarrow     ;Right arrow?
  202.           jne  C6             ;No
  203.           cmp  cs:Cntflg,0       ;Cntrl right arrow?
  204.           je   C5A            ;No
  205.           mov  dl,79          ;Set for last col
  206.           jmp  B1
  207. C5A:      cmp  dl,79          ;At last col?
  208.           je   B0             ;Yes
  209.           inc  dl             ;Inc col
  210.           jmp  B1
  211.  
  212. C6:       cmp  al,Cntrl       ;Control pressed?
  213.           jne  C7             ;No
  214.           inc  Cntflg         ;Yes, set flag
  215.           jmp  B0
  216.  
  217. C7:       cmp  al,Cntnot      ;Cntrl key released?
  218.           jne  C8             ;No
  219.           mov  Cntflg,0       ;Clear flag
  220.           jmp  B0
  221.  
  222. C8:       cmp  al,Esc         ;Escape?
  223.           jne  C9             ;No
  224.           jmp  Exit           ;Yes, exit
  225.  
  226. C9:       cmp  al,25          ;Was a P?
  227.           je   Check          ;Yes, print whole screen
  228.  
  229.           cmp  al,Pgup        ;Page up?
  230.           jne  D1             ;No
  231.           mov  dh,0           ;Set to top row
  232.           jmp  B1
  233.  
  234. D1:       cmp  al,Pgdn        ;Page down
  235.           jne  D3             ;No
  236.           mov  dh,24          ;Set to last row
  237. D2:       jmp  B1
  238.  
  239. D3:       cmp  al,Enterkey    ;Enter?
  240.           jne  D2             ;No, ignore the key and wait for another
  241.           cmp  Endflg,0       ;1st selection?
  242.           jne  D4             ;No
  243.           mov  Stloc,dx       ;Save start box location
  244.           inc  Endflg         ;=> start saved
  245.           mov  si,Msg2        ;Print End prompt
  246.           call Prompt
  247.           jmp  B0             ;Get next command
  248. D4:       mov  Endloc,dx      ;Save end location
  249.  
  250. Check:    mov  si,Buffer      ;ds:si=buffer
  251.           call Prompt         ;Put original data back on screen
  252.           inc  Prtflg         ;Indicate printing has started
  253.           mov  ax,Stloc       ;Get box start
  254.           mov  cx,Endloc      ;Get box end
  255.           sub  ch,ah          ;Rows OK?
  256.           jc   Exit           ;No
  257.           sub  cl,al          ;Cols OK?
  258.           jc   Exit           ;No, exit
  259.           add  cx,0101h       ;ah=rows, al=columns to do
  260.           mov  Row,ch         ;Save them
  261.           mov  Col,cl
  262.  
  263. ;Compute start offset.
  264.           mov  cl,al          ;Save column
  265.           mov  ch,80          ;Chars/row
  266.           xchg al,ah          ;Get row to al
  267.           mul  ch             ;ax=char offset to start of row
  268.           mov  ch,0           ;cx=column
  269.           add  ax,cx          ;ax=char offset of start location
  270.           shl  ax,1           ;Byte offset since 2 bytes/char
  271.           mov  si,ax          ;Save it
  272.  
  273. ;Get a row of data to the buffer.
  274. E0:       push ds
  275.           mov  ax,Vidmem      ;Set ds=video mem
  276.           mov  ds,ax
  277.           mov  es,cs          ;Set es this segment
  278. E1:       mov  cl,cs:Col      ;Get cols to do
  279.           mov  ch,0           ;cx=cols to do
  280.           mov  di,Rowbuf      ;es:di point to screen row buffer
  281.           push si,di,cx       ;Save pointers and count
  282. E2:       lodsw               ;Get char & attr from screen
  283.           stosb               ;Save char in row buffer
  284.           loop E2             ;Do for all chars on row
  285.           mov  ax,0A0Dh       ;Add a cr-lf
  286.           stosw
  287. ;Ckeck for and replace (with a space) any control chars.
  288.           pop  cx,di          ;Get cols and buffer pointer
  289. E3:       mov  al,cs:[di]     ;Get a char from buffer
  290.           cmp  al,20h         ;Control char?
  291.           jb   E4             ;Yes
  292.           cmp  al,0FFh        ;Bad char?
  293.           jb   E5             ;No
  294. E4:       mov  cs:b[di],20h   ;Replace with a space
  295. E5:       inc  di             ;Point to next char
  296.           loop E3             ;Check all
  297. ;Now send chars in buffer to printer.
  298.           call Printer
  299.           pop  si             ;Get start of row
  300.           add  si,160         ;Next row
  301.           dec  cs:Row         ;Done all rows?
  302.           jne  E1             ;No
  303.           pop  ds
  304.  
  305. ;Now exit.
  306. Exit:     mov  si,Buffer      ;Put old screen data back
  307.           call Prompt
  308.           mov  dx,cs:Curpos      ;Restore Cursor
  309.           call Poscur
  310.           mov  cx,cs:Curtyp
  311.           mov  ah,1
  312.           int  Video
  313. ;Set old keyboard and timer interrupts back.
  314.           mov  ax,0           ;Set ds=0 (int area)
  315.           mov  ds,ax
  316.           cli                 ;Disable interrupts
  317.           mov  ax,cs:Oldoff8  ;Set old int 8
  318.           mov  bx,cs:Oldseg8
  319.           mov  cx,cs:Oldoff9  ;Set old int 9
  320.           mov  dx,cs:Oldseg9
  321.           mov  [32],ax
  322.           mov  [34],bx
  323.           mov  [36],cx
  324.           mov  [38],dx
  325.           sti                 ;Enable ints
  326.           call Resetkbd       ;Reset the keyboard
  327.           mov  sp,bp
  328.           pop  es,ds,di,si,dx,cx,bx,ax,bp ;Restore all for calling pgm
  329.           iret                ;Return from interrupt
  330.  
  331. ;Subroutines ---------------------------------------------------------
  332. Poscur:   mov  ah,Setcur      ;Set cursor video service
  333.           mov  bh,Vpage       ;Current video page
  334.           int  Video          ;Set cursor pos
  335.           ret
  336.  
  337. Prompt:   push ax,cx,es,di
  338.           mov  ax,Vidmem      ;Set es=Video segment
  339.           mov  es,ax
  340.           mov  di,Promptpos   ;es:di=prompt pos
  341.           mov  cx,18          ;18 words to move
  342.           rep  movsw          ;Move them to video mem
  343.           pop  di,es,cx,ax
  344.           ret
  345.  
  346. Getkey:   mov  ah,0           ;Wait for key Keyboard service
  347.           int  16h            ;Do it
  348.           ret
  349.  
  350. Resetkbd: in   al,61h         ;Get current control value
  351.           mov  ah,al          ;Save it in ah
  352.           or   al,80h         ;Set msb
  353.           out  61h,al         ;Send it to control port
  354.           mov  al,ah          ;Get original value
  355.           out  61h,al         ;Send it to control port
  356.           cli                 ;Disable ints
  357.           mov  al,20h         ;Send EOI value to 8259
  358.           out  20h,al
  359.           sti                 ;Enable ints
  360.           ret
  361.  
  362. ;Print the row of chars in the row buffer.
  363. Printer:  push ds
  364.           xor  dx,dx          ;Select LPT1
  365.           mov  ds,cs          ;Set ds this code
  366.           mov  Timeval,36     ;Set a 2 second wait
  367. G1:       call Getstat        ;Get printer status
  368.           cmp  ah,90h         ;OK?
  369.           je   G3             ;Yes
  370.           cmp  Timeval,0      ;Timed out?
  371.           jne  G1             ;No
  372.           call PNR            ;Print 'Printer not ready' prompt
  373.           mov  Timeval,180    ;Set a 10 second wait
  374. G2:       call Getstat        ;Get printer status
  375.           cmp  ah,90h         ;OK now?
  376.           je   G8             ;Yes
  377.           cmp  Timeval,0      ;Timed out?
  378.           jne  G2             ;No
  379.           jmp  Exit           ;Yes, give up
  380. G8:       call PIB            ;Put old screen back
  381. G3:       mov  si,Rowbuf      ;ds:si points to row buffer
  382.           mov  cl,Col         ;cx=Columns
  383.           mov  ch,0
  384.           add  cl,2           ;Add 2 for cr-lf at end
  385. G4:       lodsb               ;Get a char from buffer
  386.           mov  ah,0           ;Send char service
  387.           int  17h            ;no, send to printer
  388.           test ah,10h         ;Still selected?
  389.           je   G7             ;No
  390.           loop G4             ;Yes, print next char
  391.           pop  ds
  392.           ret
  393. G7:       push si,cx          ;Save position and count
  394.           mov  Timeval,180    ;Set a 10 second timeout
  395.           call PNR            ;Print 'Printer not ready'
  396. G5:       call Getstat        ;Get printer status
  397.           test ah,10          ;Selected?
  398.           jne  G6             ;Yes
  399.           cmp  Timeval,0      ;Timed out?
  400.           jne  G5             ;No
  401.           jmp  Exit           ;Yes, give up
  402. G6:       call PIB            ;Put old screen back
  403.           pop  cx,si          ;Get old position and count
  404.           jmp  G4             ;and continue printing
  405.  
  406. Getstat:  mov  ah,2
  407.           int  17h
  408.           ret
  409.  
  410. PNR:      push si
  411.           mov  si,Msg3
  412. PNR1:     call Prompt
  413.           pop  si
  414.           ret
  415.  
  416. PIB:      push si
  417.           mov  si,Buffer
  418.           jmp  PNR1
  419.  
  420. ;Come here to install the program. ------------------------------------
  421. Initialize: jmp short Init1
  422. Msg4:     db   13,10,'Selective Print Screen ver. 2.0 by Bob Montgomery'
  423.           db   ' installed.',13,10,'$'
  424. Init1:    mov  ah,Getvec
  425.           mov  al,5
  426.           int  DOS
  427.           mov  [Oldoff5],bx
  428.           mov  [Oldseg5],es
  429.           mov  ah,Setvec
  430.           mov  al,5
  431.           mov  dx,Newint5
  432.           int  DOS
  433.           mov  dx,Msg4
  434.           mov  ah,9
  435.           int  DOS
  436.           mov  dx,Initialize
  437.           int  27h
  438.  
  439.